package com.parking.user.controller;
import com.parking.common.core.model.PageInfo;
import com.parking.common.core.model.Result;
import com.parking.common.core.model.StateData;
import com.parking.common.core.util.CardIdUtil;
import com.parking.common.core.util.JwtUtil;
import com.parking.common.web.aop.Permission;
import com.parking.common.web.util.FileUtil;
import com.parking.common.web.util.OssUtil;
import com.parking.common.web.util.RedisUtil;
import com.parking.dto.RentersUserDto;
import com.parking.dto.UserDto;
import com.parking.dto.UserInfoDto;
import com.parking.exception.UserException;
import com.parking.exception.UserExceptionCode;
import com.parking.form.*;
import com.parking.user.entity.UserAccount;
import com.parking.user.entity.UserInfo;
import com.parking.user.service.UserAccountService;
import com.parking.user.service.UserInfoService;
import io.jsonwebtoken.Claims;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ResponseHeader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.validation.Valid;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author 香菜狗带
 * @since 2023年11月28日
 */
@RestController
@RequestMapping("/userInfo")
@Api(tags = "用户个人信息接口")
public class UserInfoController {
    @Resource
    private UserInfoService userInfoService;
    @Resource
    private OssUtil ossUtil;
    @Resource
    private UserAccountService userAccountService;
    @Resource
    private RedisUtil redisUtil;
    /***
     * 查询当前用户信息
     * 参数：
     ("用户Id")：userId;
     */
    @GetMapping("/getUserInfoById.user")
    @ApiOperation("查询当前用户信息")
    public Result getUserInfoById(@RequestHeader("authorization") String authorization) throws Exception {
        String refreshToken = redisUtil.get(authorization);
        Integer userId = JwtUtil.getUserId(refreshToken);
        UserInfoDto dto =userInfoService.getUserInfoById(userId);
        return Result.getResult(UserInfoDto.class).setCode(200).setMessage("用户信息查询成功").setData(dto);
    }
    /**
     * 查询全部用户
     * 参数：
     * phone:手机号
     * name:姓名
     * */
    @PostMapping("/getUserInfoAll.platform")
    @Permission(resources = "/getUserInfoAll.platform")
    @ApiOperation("查询全部用户")
    public Result getUserInfoAll(@RequestBody SelUserInfoForm form) throws Exception {
        System.out.println(form+"参数");
        PageInfo dto =userInfoService.getUserInfoAll(form);
        return Result.getResult(PageInfo.class).setCode(200).setMessage("全部用户信息查询成功").setData(dto);
    }
    /**
     * 修改用户信息
     * 参数：
     * phone:手机号
     * userInfoName:姓名
     *
     * */
    @PostMapping("/upUserDataById.user")
    @ApiOperation("修改用户信息")
    public Result upUserDataById(@RequestBody @Valid UpDataForm form, @RequestHeader("authorization")String authorization) throws Exception {
        String refreshToken = redisUtil.get(authorization);
        Integer userId = JwtUtil.getUserId(refreshToken);
        userInfoService.upUserDataById(form,userId);
        return Result.getResult().setCode(200).setMessage("修改用户信息成功");
    }
    /**
     * 上传头像
     * 参数：
     * image:文件名
     * */
    @ApiOperation("上传头像接口")
    @PostMapping("/upload.user")
    public Result upLoad(MultipartFile image,@RequestHeader("authorization")String authorization) throws Exception {
        InputStream stream = image.getInputStream();
        byte[] header=new byte[8];//解析字节码
        stream.read(header,0,8);//字节流读取文件
        if (!(FileUtil.isJpg(header)||FileUtil.isPng(header))){
            //真=》假=》真（抛异常）
            throw new UserException(UserExceptionCode.USERINFO_DILE_NO);
        }
        //去掉uuid的横线
        String prefix = UUID.randomUUID().toString().replaceAll("-", "");
        //随机字符后缀文件格式
        String name = prefix + "." + (FileUtil.isJpg(header) ? "jpg" : "png");
        //调用上传oss的方法，获取oss的地址
        String path = ossUtil.uploadFile(image.getInputStream(), name);
        String refreshToken = redisUtil.get(authorization);
        Integer userId = JwtUtil.getUserId(refreshToken);
        userInfoService.upLoad(path,userId);
        return Result.getResult().setMessage("上传头像成功").setCode(200).setData(path);
    }
    /**
     * 修改头像
     * 参数：
     * image:文件名
     * userInfoImg：用户头像地址
     * fileName:文件名称
     * */
    @PostMapping("/upBookImage.user")
    @ApiOperation("修改头像接口")
    public Result upUserInfoImg(MultipartFile image,@RequestHeader("authorization") String authorization) throws Exception {
        InputStream stream = image.getInputStream();
        byte[] header=new byte[8];//解析字节码
        stream.read(header,0,8);//字节流读取文件
        if (!(FileUtil.isJpg(header)||FileUtil.isPng(header))){
            //真=》假=》真（抛异常）
            throw new UserException(UserExceptionCode.USERINFO_DILE_NO);
        }
        //去掉uuid的横线
        String prefix = UUID.randomUUID().toString().replaceAll("-", "");
        //随机字符后缀文件格式
        String name = prefix + "." + (FileUtil.isJpg(header) ? "jpg" : "png");
        UpUserImgForm form = new UpUserImgForm();
        form.setFileName(name);
        form.setImage(image);
        String refreshToken = redisUtil.get(authorization);
        Integer userId = JwtUtil.getUserId(refreshToken);
        form.setUserId(userId);
        userInfoService.upUserInfoImg(form);
        return Result.getResult().setMessage("修改头像成功").setCode(200);
    }
    /**
     * 实名认证
     * 参数：
     * userInfoName:姓名
     * userInfoCard：用户头像地址
     * userId:用户Id
     * */
    @PostMapping("/attestationName.user")
    @ApiOperation("用户实名认证")
    public Result  attestationName(@RequestBody @Valid AtteUserNameForm form,@RequestHeader("authorization")String authorization) throws Exception {
        String refreshToken = redisUtil.get(authorization);
        Integer userId = JwtUtil.getUserId(refreshToken);
        Boolean bo=userInfoService.attestationName(form,userId);
        if (bo) {
            return Result.getResult().setCode(200).setMessage("用户实名认证成功").setFlag(true);
        }else {
            return Result.getResult().setCode(200).setMessage("用户实名认证失败").setFlag(false);
        }
    }
    /**
     * 用户修改密码
     * 参数：
     *  ("旧密码")：oldPass;
     * ("新密码")：newPass;
     * userId:用户Id
     * */
    @PostMapping("/upUserPass.user")
    @ApiOperation("用户修改密码")
    public Result upUserPass(@RequestBody UpUserPassForm form,@RequestHeader("authorization")String authorization) throws Exception {
        String refreshToken = redisUtil.get(authorization);
        Integer userId = JwtUtil.getUserId(refreshToken);
        userInfoService.upUserPass(form,userId);
        return Result.getResult().setCode(200).setMessage("用户修改密码成功");
    }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /**
     * 判断用户信息是否实名
     * 参数: 用户信息Id userInfoId
     * 返回: 用户名称 userInfoName
     * 用户电话 userInfoTel
     * 用户年龄 userInfoAge
     * 用户头像 userInfoImg
     * 方法: 1.判断userInfoId是否存在对应的用户信息 若不存在则抛异常
     * 2.判断对应的用户信息是否实名 若不是则抛异常
     * 3.将用户信息放入Dto返回
     */
    @GetMapping("/selectUserInfoById")
    @ApiOperation("判断用户信息是否实名(订单模块调用)")
    Result<UserInfoDto> selectUserInfoById(@RequestParam("userInfoId") Integer userInfoId) {
        UserInfoDto dto = userInfoService.selectUserInfoById(userInfoId);
        return Result.getResult(UserInfoDto.class).setCode(200).setMessage("用户已经实名").setData(dto);
    }
    /***
     * 出租客
     * 查询根据ID用户信息
     * 参数：userInfoId;
     * ("令牌")：authorization;
     *
     *  返回出租客用户信息dto：
     *  用户信息Id：userInfoId
     *  用户昵称：userInfoName
     *  用户电话：userInfoTel
     */
    @GetMapping("/findUserById")
    @ApiOperation("查询当前用户信息(出租客模块调用)")
    public Result findUserById(@RequestHeader("authorization") String authorization,Integer userInfoId) throws Exception {
        String refreshToken = redisUtil.get(authorization);
        Integer rentersId = JwtUtil.getRentersId(refreshToken);
        RentersUserDto dto =userInfoService.findUserById(rentersId,userInfoId);
        return Result.getResult(RentersUserDto.class).setCode(200).setMessage("查询当前用户信息成功").setData(dto);
    }
//    /***
//     * 出租客
//     * 查询根据ID用户信息
//     * 参数：form
//     * 用户名称：userInfoName
//     * 当前页数：pageNum
//     * 当前条数：pageSize
//     */
//    @GetMapping("/findUserById.renters")
//    @ApiOperation("查询当前用户信息")
//    private Result findUserById(RentersSelUserform) throws Exception {
//        RentersUserDto dto =userInfoService.findUserById(rentersId,userInfoId);
//        return Result.getResult(RentersUserDto.class).setCode(200).setMessage("查询当前用户信息成功").setData(dto);
//    }






}

